package com.itheima.ui;



import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

//设置游戏主界面
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //加载图片的时候，会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
    //记录空白方块在二维数组中的位置
    int x=0;
    int y=0;

    //添加计步器
    int step=0;

    //定义一个二维数组，存储正确的数据
    int[][] win={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0},
    };
    //创建选项下面的条目对象

    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");

    //创建公众号下面的条目对象
    JMenuItem commenItem = new JMenuItem("公众号");

    //设置窗体/界面de方法
    public GameJFrame(){
        //初始化界面
        initJFrame();
        //初始化菜单
        initJmenuBar();
        //初始化数据（打乱）
        initData();
        //初始化图片(根据打乱后的结果加载图片)
        initImage();
        //判断新数组是否与原数组相同
        victory();



        //设置界面是否隐藏
        this.setVisible(true);

    }

    private boolean victory() {
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if (!(data[i][j]==win[i][j])){
                    //如果data数组与win数组中有一个数据不一致，则表示数组不同
                    return false;
                }
            }
        }
        //循环结束，表示数组相同
        return true;
    }


    //打乱数据
    private void initData() {
        //定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //打乱数组中的数据
        //生成随机索引
        Random random = new Random();
        //将随机索引与遍历的数据进行交换
        for (int i = 0; i < tempArr.length; i++) {
            //获取随机索引
            int index = random.nextInt(tempArr.length);
            //拿着遍历到的每一个元素与随机索引进行交换
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
       /* //遍历数组，查看打乱后的数组
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i]+" ");
        }*/
        //给二维数组添加数据
        //遍历一维数组temparr得到的每一个元素，将每一个元素一次添加到二维数组中
        for (int i = 0; i < tempArr.length; i++) {
            if (tempArr[i]==0){
                x=i/4;
                y=i%4;
            }else{
                data[i/4][i%4]=tempArr[i];
            }

        }

    }
    //初始化菜单
    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();
        if (victory()){
            //显示胜利图片
            ImageIcon imageWinIcon = new ImageIcon("E:\\basic-code\\image\\shengli.png");
            JLabel winJLabel = new JLabel(imageWinIcon);
            winJLabel.setBounds(93,283,410,200);
            this.getContentPane().add(winJLabel);
        }
        //定义计步功能
        JLabel stepCount = new JLabel("步数" + step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                //获取当前加载图片的序号
                int num=data[i][j];
                //创建一个ImageIcon的对象
                ImageIcon icon = new ImageIcon("E:\\basic-code\\image\\"+num+".jpg");
                //创建一个JLable的对象（管理容器）
                JLabel jLabel = new JLabel(icon);
                //指定图片的位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给每个小图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                //this.add(jLabel);
                this.getContentPane().add(jLabel);
            }

        }
        //添加背景图片
        ImageIcon BGImage = new ImageIcon("E:\\basic-code\\image\\BG.jpg");
        //创建背景容器对象
        JLabel BGJlabel = new JLabel(BGImage);
        BGJlabel.setBounds(40,40,508,560);
        //把背景图片添加到界面中
        this.getContentPane().add(BGJlabel);

        //刷新界面
        this.getContentPane().repaint();






    }
    //初始化菜单
    private void initJmenuBar() {
        //初始化菜单
        //创建菜单对象
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单上面的两个选项的对象（功能 关于我们）
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");


        //将条目对象添加到选项对象中
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(commenItem);

        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        commenItem.addActionListener(this);


        //将选项对象添加到菜单对象中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }
    //初始化界面


    private void initJFrame() {
        //设置游戏界面的宽和高
        this.setSize(603,680);
        //设置游戏标题
        this.setTitle("拼图小游戏 v1.0");
        //设置是否置顶
        this.setAlwaysOnTop(true);
        //设置界面是否居中
        this.setLocationRelativeTo(null);
        //设置界面关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下A不松时调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code==65){
            //清空所有图片
            this.getContentPane().removeAll();
            //加载第一张完整图片
            ImageIcon ImageAllIcon= new ImageIcon("E:\\basic-code\\image\\all.jpg");
            JLabel all = new JLabel(ImageAllIcon);
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);

            //添加背景图片
            ImageIcon BGImage = new ImageIcon("E:\\basic-code\\image\\BG.jpg");
            //创建背景容器对象
            JLabel BGJlabel = new JLabel(BGImage);
            BGJlabel.setBounds(40,40,508,560);
            //把背景图片添加到界面中
            this.getContentPane().add(BGJlabel);

            //刷新界面
            this.getContentPane().repaint();

        }

    }

   @Override
    public void keyReleased(KeyEvent e) {
        if (victory()){
            //如果游戏胜利，则不执行上下左右移动的代码
            return;
        }
        //对上下左右进行判断
        //左：37 上：38 右：39 下：40
        int code = e.getKeyCode();
        if (code==37){
            //计步器
            step++;
            //向左移动
            if (y==3){
                //表示空白方块已经在最左方了，他的左方没有图片能再移动了
                return;
            }
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            //调用方法按照最新的数字加载图片
            initImage();
            System.out.println("//向左移动");


        }else if (code==38){

            //向上移动
            //计步器
            step++;
            /*逻辑：把空白方块下的数字向上移动
            * x,y表示空白方块的坐标
            * x+1,y表示空白方块下面的数字
            * 把空白方块下方的数字赋值给空白方块
            * */
            if (x==3){
                //表示空白方块已经在最下方了，他的下方没有图片能再移动了
                return;
            }
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;
            x++;
            //调用方法按照最新的数字加载图片
            initImage();
            System.out.println("向上移动");

        }else if (code==39){
            //向右移动
            //计步器
            step++;
            if (y==0){
                //表示空白方块已经在最右方了，他的右方没有图片能再移动了
                return;
            }
            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            //调用方法按照最新的数字加载图片
            initImage();
            System.out.println("向右移动");
        }else if (code==40){
            //向下移动
            //计步器
            step++;
            if (x==0){
                //表示空白方块已经在最上方了，他的上方没有图片能再移动了
                return;
            }
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            //调用方法按照最新的数字加载图片
            initImage();
            System.out.println("向下移动");
        }else if (code==65) {
            initImage();
        }else if (code==87) {
            data=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0},


            };
            initImage();
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        if (obj==replayItem){
            System.out.println("重新游戏");
            //计步器清零
            step=0;
            //再次打乱二维数组中数据
            initData();
            //重新加载图片
            initImage();

        }else if (obj==reLoginItem){
            System.out.println("重新登录");
            //关闭当前的游戏界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();
        }else if (obj==closeItem){
            System.out.println("关闭游戏");
            //直接关闭虚拟机即可
            System.exit(0);

        }else if (obj==commenItem){
            System.out.println("公众号");
            //创建一个弹框对象
            JDialog jDialog = new JDialog();
            //创建一个管理图书的容器对象Jlabel
            JLabel jLabel = new JLabel(new ImageIcon("E:\\basic-code\\image\\callme.png"));
            jLabel.setBounds(0,0,258,258);
            //将图片添加到弹框中
            jDialog.getContentPane().add(jDialog);
            //给弹框设置大小
            jDialog.setSize(318,188);
            //让弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭则无法操作下面的界面、
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);

        }
    }
}
